<?php

进程组 至少包括一个进程
    执行一个程序对应的是一个进程组, 方便内核管理进程
    对进程组操作即对所有进程组员进行操作
    进程组标识符即是进程组长进程的PID
    对进程组组长操作直接使用PID, 对进程组操作使用-PID
    进程组组长进程结束不会影响进程组其它进程成员

    posix_getpgrp       返回当前进程组PID
    posix_setpgid       将某个PID加入某个进程组

会话 至少包括一个进程组， 对进程组进行管理
    一个会话包括多个进程组, 创建会话的进程组则是此会话的会长进程组
    进程组组长不能创建会话
    一个会话对应一个控制终端

    posix_getsid    获取当前会话的ID
    posix_setsid    创建会话

    控制终端        获取用户输入
    前台进程组      使用控制终端的进程组, 一个会话中只能有一个
    后台进程组      没有使用控制终端的进程组

守护进程 -> 后台进程
    服务型应用需要创建守护进程
    运行程序不能受原控制终端影响，不能原进制组影响

    创建孤儿进程
    创建会话
    关闭所有文件描述符(STDIN, STDOUT, STDERR)
    切换工作路径(/)

-------------------------------------------------------------------------------
进程间通讯
    信号(signal)
    管道(fifo)
    消息队列(msg)
    共享内存(shm)
    信号量(sem)
    套接字(socket)  网络编程

信号    异步通知
    软件模拟硬件中断机制

    信号源
        kill -l     列出当前操作系统信号源

    信号产生
        操作系统遇到某些状况产生信号
        使用kill命令产生信号
        使用posix_kill函数发送信号

    信号默认操作
        什么都不做
        结束本进程
        结束到后台

    捕捉信号 pcntl_signal


管道    数据交互
    管道文件
    管道命令    |       使用进程间通讯方法实现的命令

    管道对应内核空间，空间有限
    管道只能一对一通信
    管道对应环形队列，只能读一次
    读写端同时存在, 否则会阻塞
    单双工模式  一个进程写，另一个进程只能读

    有名管道        对应管道文件, 应用在没有关系进程之间
        mkfifo          创建管道文件
        posix_mkfifo    创建管道文件的函数
    无名管道        应用在有关系的进程之间
        封装管道的函数
            popen       执行外部命令并且返回文件流
                        对文件流读则取出命令执行标准输出
                        对文件流写则写到命令标准输入
            pclose      对应popen关闭文件流

            proc_open   类似popen, 提供双向管道, 功能更强大

    mplayer提供了控制接口
        mplayer 视频文件路径  -slave -quiet -input file=管道文件路径
            对管道写命令可以控制mplayer播放

        列出mplayer管道控制命令列表(所有命令必须后面接换行符)
            mplayer -input cmdlist
                pause           暂停/播放
                seek            快进/快退
                vo_fullscreen   全屏
                volume          调节音量
                balance         调节平衡
                mute            静音
                quit            退出
                osd 3           显示时间进程度
                loop            循环播放次数

                get_percent_pos
                get_time_pos    获取当前播放时间
                get_time_length 获取视频总时长

消息队列    数据交互
    ipcs        查看当前系统消息队列 共享内存 信号量的状态

    读写端可以不同时存在(离线通信)
    可以一对多通信

    msg_get_queue       创建消息队列
    msg_queue_exists    检查消息队列是否存在
    msg_receive         接受消息
    msg_send            发送消息
    msg_remove_queue    删除消息队列

共享内存    数据交互
    同块物理内存映射在不同虚拟地址(访问用户态的空间，访问效率更高)
    适应大批量的数据交互, 通讯效率极高

    shm_attach          创建并映射共享内存
    shm_detach          取消映射关系
    shm_remove          删除共享内存
    shm_put_var         将数据写入共享内存
    shm_has_var         判断共享内存是否存在指定值
    shm_get_var         获取共享内存上的数据
    shm_remove_var      删除共享内在上的数据

信号量      并发处理 (锁机制, 保护进程并发冲突)
    君子协议锁

    sem_get             创建信号量
    sem_acquire         上锁
    sem_release         解锁
    sem_remove          删除信号量

线程
    作用：多段代码同时执行, 提高运算能力(并行处理)
    软件 -> 程序 -> 进程 -> 线程

    线程与进程的区别:
        创建线程只是独立栈, 执行效率高
        创建进程独立虚拟内存空间, 稳定性高

    线程与进程的关系: 线程依赖进程空间

    PHP线程功能默认禁用(应用场景稀少，线程扩展功能不稳定)
        不建议在生产环境使用, 简单使用线程问题不大

    线程扩展的安装:
        安装php-dev包，php-config/phpize
            php-config      列出当前php编译选项及配置
            phpize          给扩展生成php编译环境的configure

        重新编译PHP编码包加入 --enable-maintainer-zts 选项
            PHP5:
                指定安装目录
                --prefix=/usr/local/php5.6
                开启zend安装线程
                --enable-maintainer-zts
                指定php.ini配置文件路径
                --with-config-file-path=/usr/local/php5.6/etc
                支持进程控制扩展pcntl
                --enable-pcntl
                支持多字节字符串扩展
                --enable-mbstring
                支持zlib压缩解压
                --enable-zlib
                支持sockets网络编程
                --enable-sockets
                支持curl扩展
                --with-curl
                支持mcrypt加密扩展
                --with-mcrypt
                支持图形处理扩展
                --with-gd

                进入php5.6的源码包重新编译包
                ./configure --with-config-file-path=/usr/local/php5.6/etc --enable-maintainer-zts --prefix=/usr/local/php5.6
                make -j4
                sudo make install

                到pecl.php.net下载phtread-2.0.10.tgz解压并进入目录
                /usr/local/php5.6/bin/phpize
                ./configure --with-php-config=/usr/local/php5.6/bin/php-config
                make -j4
                sudo make install

                打开/usr/local/php5.6/etc/php.ini 添加extension=phtreads.so
                    没有此文件创建此文件



            PHP7:(先不要编译, 线程功能使用php5.6)
                sudo apt install libedit-dev systemtap-sdt-dev -y

                ./configure	--prefix=/usr	\
                    --includedir=/usr/include	\
                    --mandir=/usr/share/man	\
                    --infodir=/usr/share/info	\
                    --libdir=/usr/lib/x86_64-linux-gnu	\
                    --libexecdir=/usr/lib/x86_64-linux-gnu	\
                    --datadir=${prefix}/share/php/7.0	\
                    --with-config-file-path=/etc/php/7.0/cli	\
                    --with-config-file-scan-dir=/etc/php/7.0/cli/conf.d	\
                    --sysconfdir=/etc	\
                    --localstatedir=/var	\
                    --build=x86_64-linux-gnu	\
                    --host=x86_64-linux-gnu	\
                    --config-cache	\
                    --cache-file=/build/php7.0-lPMnpS/php7.0-7.0.8/config.cache	\
                    --program-suffix=7.0	\
                    --disable-cgi	\
                    --disable-phpdbg	\
                    --disable-all	\
                    --disable-debug	\
                    --disable-rpath	\
                    --disable-static	\
                    --enable-cli	\
                    --enable-libxml	\
                    --enable-session	\
                    --enable-filter	\
                    --enable-hash	\
                    --enable-dtrace	\
                    --enable-pcntl	\
                    --enable-maintainer-zts	\
                    --with-pic	\
                    --with-layout=GNU	\
                    --without-pear	\
                    --with-openssl=yes	\
                    --with-mhash=/usr	\
                    --with-zlib=/usr	\
                    --with-zlib-dir=/usr	\
                    --with-libedit=shared,/usr

        自动安装:
            pecl install pthreads

        手动安装:
            下载扩展包并且解压进入目录
                pthread-3.*     对应PHP7
                pthread-2.*     对应PHP5

                wget http://pecl.php.net/get/pthreads-3.1.6.tgz
                tar -xf pthreads-3.1.6.tgz
                cd pthread-3.1.6

            使用对应PHP版本的phpize工具自动生成configure并且编译安装
                phpize
                ./configure
                make clean
                make -j4
                sudo make install

        修改php.ini配置文件添加以下内容
            extension = pthreads.so


-------------------------------------------------------------------------------

PHP库
    PHP源代码内置扩展库   编译PHP指定是否开羸内置扩展库

    pear        PHP代码库(pear.php.net)
        纯PHP代码，直接包含使用
        pear工具也是使用PHP实现

        pear list(l)            列出当前已安装pear包
        pear list 包名          列出指定包名的信息
        pear list-upgrade(lu)   列出针对已安装pear包全部有效更新
        pear help 命令          列出pear工具的命令帮助
        pear install(i) 包名    下载安装指定包名
        pear uninstall(un) 包名 卸载指定包
        pear search(sp) 包名    搜索包
        pear config-show        显示pear所有配置信息
        pear set-config         设置pear配置信息
        pear list-channels(lc)  列出所有本地化pear通道

        自动安装Console_Table扩展
            pear install Console_Table

    pecl        PHP扩展, pecl曾经是pear的子项目(pecl.php.net)
        使用C语言编写的扩展，需要编译安装并且设置配置文件
        依赖phpize工具
            安装php-dev包才有phpize工具
            解析扩展代码自动生成configure

        pecl install 包名
            从服务器下载包并且解压，使用phpize生成configure再编译安装
            修改php.ini配置文件添加extension = 包名.so
            建议设置配置文件让php自动加载，不建议使用dl加载

        自动安装sdl扩展
            pecl install sdl-beta
            pecl install pthread

    composer    组件式编程(避免重复造轮子)
        组件是打包代码，用于解决某个具体的问题(纯PHP代码)
        php-fig组织 定义PSR标准使组件增加通用性

        查找组件: packagist.org

        composer工具会自动查找packagist.org组件的依赖
        确定组件再到github.com下载所有依赖
        并且自动产生符合PSR-4标准自动加载器

    composer工具的安装(getcomposer.org)
        wget https://getcomposer.org/installer -O composer-setup.php
        php composer-setup.php

    组件的名称: 厂商名/包名
    包的版本号: 以三个点分隔
        第一个数字代表主版本号  更新破坏向后兼容性
        第二个数字代表次版本号  小幅更新没有破坏向后兼容性
        第三个数字代表修订版本号  修改正向后兼容缺陷

    安装组件
        composer require 厂商名/包名
            会自动下载稳定版本并且生成自动加载器
            composer.json   记录安装的组件列表
            composer.lock   详细记录项目安装的组件信息，锁定项目使用组件的版本
            自动创建vendor文件夹，自动加载器生成在此目录里，名为autoload.php
            使用组件:
                require_once "vendor/autoload.php";

    删除组件
        composer remove 厂商名/包名

    更新组件
        composer update 厂商名/包名

    查找组件(文本形式查找组件)
        composer search 关键词

    查看当前项目使用的组件
        composer show

======================================================================
实现mplayer控制终端

实现两个终端聊天
    实时双向聊天
    支持退出

vim:ft=php
